EXEC(3) | Linux Programmer's Manual | EXEC(3) |
名前¶
execl, execlp, execle, execv, execvp - ファイルを実行する
書式¶
#include <unistd.h>
extern char **environ;
int execl(const char *path, const char
*arg, ...);
int execlp(const char *file, const char *arg,
...);
int execle(const char *path, const char
*arg,
..., char * const envp[]);
int execv(const char *path, char *const
argv[]);
int execvp(const char *file, char *const
argv[]);
説明¶
exec() ファミリーの関数は現在のプロセスイメージを新しいプロセスイメージで置き 換える。このマニュアルで説明されている関数は execve(2) のフロントエンドである。 (現在のプロセスイメージの置き換えについての詳細は execve(2) のマニュアルを参照)
これらの関数の最初の引き数は、実行されるファイルのパス名である。
関数 execl(), execlp(), execle() の const char *arg とそれに続く省略部分は arg0, arg1, ..., argn とみなされる。 これらには、実行されるプログラムで利用可能な引き数のリストを指定する (引き数のリストは NULL で終端された文字列へのポインタから構成される)。 慣習として、最初の引き数は、実行されるファイル名 へのポインタにする。引き数のリストは必ず NULL で終わらなければならず、これらの関数は可変長引き数関数なので、 このポインタは (char *) NULL とキャストしなければならない。
関数 execv() と execvp() は、利用可能な引き数リスト (NULL で終端された文字列への ポインタの配列) を新しいプログラムに渡す。 慣習として、最初の引き数は実行されるファイル名へ のポインタにする。ポインタの配列は必ず NULL で終わらなければならない。
関数 execle() では新しいプロセスの環境も指定する。 環境は引き数リスト (引き数リストもしくは追加の引き数を持った argv 配列へのポインタ) の最後の NULL ポインタに続けて指定する。 追加の引き数は、NULL で終端された文字列へのポインタの配列であり、 NULL ポインタで終わらなければならない。 他の関数では、現在のプロセスの外部変数 environ から新しいプロセス用の環境を与える。
execlp() と execvp() の特別な動作¶
関数 execlp() と execvp() は、指定されたファイル名がスラッシュ (/) を含んでいない場合、 シェルと同じ動作で実行可能なファイルを探索する。 検索パスは環境変数 PATH で指定されたパスである。 この変数が指定されていない場合、デフォルトPATHとして ":/bin:/usr/bin" が使用される。 また、いくつかのエラーが発生した場合の扱いが特殊である。
もしファイルが実行ファイルでない場合 (このとき呼び出そうとした execve(2) はエラー EACCES で失敗する)、これらの関数は残りの検索パスの検索を続ける。 他にファイルが見つからなくなった場合 errno に EACCES を設定し復帰する。
ファイルのヘッダが実行形式として認識できない場合 (このとき呼び出そうとした execve(2) はエラー ENOEXEC で失敗する)、これらの関数はそのファイルを最初の引き数としたシェル (/bin/sh) を実行する (これにも失敗した場合、これ以上の検索は行われない)。
返り値¶
もし exec() ファミリーが復帰してきた場合、エラーが発生している。 返り値は -1 で、 errno にそのエラーの内容がセットされる。
エラー¶
これら全ての関数は失敗する場合がある。その場合ライブラリ関数 execve(2) によって指定されたエラーを errno に設定する。
準拠¶
POSIX.1-2001.
注意¶
Linux 以外のシステムには、 (環境変数 PATH が定義されていないときの) デフォルトのパスにおいて、カレント・ディレクトリが /bin と /usr/bin の後ろに配置されるものもある。 これはトロイの木馬対策のためである。 Linux では、デフォルトのパスに、昔ながらの「現在のディレクトリを 先に探索」というルールを使っている。
ファイルを実行しようとしている間にエラーが発生した時の execlp() と execvp() のふるまいについて歴史的な慣習はあるが、伝統的に文書として記載されておらず、 POSIX 標準でも規定されていない。BSD (またおそらく他のシステム) では、 ETXTBSY が発生した場合、自動的に中断 (sleep) し再試行を行う。 Linux はそれをハードエラーとして取り扱い即座に復帰する。
伝統的に、関数 execlp() と execvp() は、上で説明したエラーと、これら 2 つの関数自身が返す ENOMEM と E2BIG 以外の全てのエラーを無視していたが、 今では、上で説明した以外のエラーが発生した場合でも、 返ってくるよう変更された。
関連項目¶
sh(1), execve(2), fork(2), ptrace(2), fexecve(3), environ(7)
2009-02-22 | GNU |